// 简化vue 状态管理 state 提交修改
import { $toClass, $trimAll } from "./main";
// vuex载入函数
/* 
	__model(state:Object,params:Object} )
	###
		此方法混入Vue原型 - $commit( Object:{ 
			// 需要更改的状态值
			data:Object
			// 使用module模块的路径   根路径可忽略
			,name: String
		 });
	 	此方法只针对 Vuex state( 单一状态树 ) 状态改变
		## 使用示例 1
			Vuex({
				state:{
					version: "text"
					,list:[
						{
							age: 12
						}
					]
				}
			})
			// index.js		
			export default {
				onLoad(){
					this.$commit({
						data:{
							version:"12"
							// 深度载入
							,["list[0].age"]: 18
						}
						//可省略  
						//,name:""
					})
				}
			}
		## 使用示例 2  模块化
			Vuex({
				["user"]:{
					state:{
						name:""
						,age:""
					}
				}
			})
			// index.js		
			export default {
				onLoad(){
					this.$commit({
						data:{
							name:"test"
							,age:"18"
						}
						//可省略  
						,name:"user"
					})
				}
			}
		## 使用示例 3  多字段同时载入
			Vuex({
				["user"]:{
					state:{
						name:""
						,age:""
					}
				}
			})
			// index.js		
			export default {
				onLoad(){
					this.$commit({
						data:{
							//不同属性  请用 | 分隔开
							["name|age"]: "test"
						}
						//可省略  
						,name:"user"
					})
				}
			}
*/
function __model(state, params) {
	const {
		data
		,name
	} = params;
	if (data) {
		if ($toClass(data) == "Object") {
			let moduleAuto = false;
			// 如果命名空间存在
			if( name && typeof name === "string" ){
				moduleAuto = true;
			}
			
			Object.keys(data).forEach((keys) => {
				
				let value = data[keys];
				let moduleKeys = keys;
				if( moduleAuto ){
					moduleKeys = name +"."+ keys;
				}
				
				let modelArr = $trimAll(  moduleKeys ).split(/[,|]/);
				modelArr.forEach((child) => {
					let serChild = child.replace(/(\[)|(\])/g, (match, p1, p2) => {
						if (p1) {
							return ".";
						} else if (p2) {
							return "";
						} else {
							return match;
						}
					});
					let modelLeveArr = serChild.split(".");
					let copyState = state;
					for (let index = 0, leveLen = modelLeveArr.length; index < leveLen; index++) {
						let leveKey = modelLeveArr[index];
						if (leveKey) {
							let leveObj = copyState[leveKey];
							if (index == leveLen - 1) {
								copyState[leveKey] = value;
								break;
							} else {
								copyState = leveObj;
							}
						}
					}
				});
			});
			
		} else {
			throw new TypeError('the params must be Object ');
		}
	} else {
		throw ReferenceError('the params is required');
	}
}



export {
	__model
}